package com.example.es.repo;

import com.example.es.entity.UsrDoc;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UsrRepository extends ElasticsearchRepository<UsrDoc, String> {
    // 可按需追加自定义方法，Spring Data 会帮你生成实现

    /**
     * 范围查询：年龄区间
     *
     * @param min      年龄下限
     * @param max      年龄上限
     * @param pageable 分页参数
     */
    @Query("""
            {
              "range": {
                "usrAge": {
                  "gte": ?0,
                  "lte": ?1
                }
              }
            }
            """)
    Page<UsrDoc> searchByAgeRange1(@Param("minAge") Integer min, @Param("maxAge") Integer max, Pageable pageable);

    /**
     * 范围查询：年龄区间
     *
     * @param min      年龄下限
     * @param max      年龄上限
     * @param pageable 分页参数
     */
    Page<UsrDoc> findByUsrAgeBetween(Integer min, Integer max, Pageable pageable);

    /**
     * 复合查询：年龄 + 加入日期区间
     * 占位符 ?0 ?1 ?2 ?3 对应方法参数
     */
    @Query("""
            {
              "bool": {
                "must": [
                  { "range": { "usrAge": { "gte": ?0, "lte": ?1 } } },
                  { "range": { "joinDate": { "gte": "?2", "lte": "?3" } } }
                ]
              }
            }
            """)
    Page<UsrDoc> searchByAgeAndJoinDate(@Param("ageFrom") Integer ageFrom, @Param("ageTo") Integer ageTo, @Param("dateFrom") String dateFrom, @Param("dateTo") String dateTo, Pageable pageable);

    /* ----------- 附加：如果还想按姓名模糊查 ------------ */
    @Query("""
            {
              "bool": {
                "must": [
                  { "range": { "usrAge": { "gte": ?0, "lte": ?1 } } },
                  { "range": { "joinDate": { "gte": "?2", "lte": "?3" } } },
                  { "match": { "usrNm": "?4" } }
                ]
              }
            }
            """)
    Page<UsrDoc> searchByAgeAndJoinDateAndName(@Param("ageFrom") Integer ageFrom, @Param("ageTo") Integer ageTo, @Param("dateFrom") String dateFrom, @Param("dateTo") String dateTo, @Param("name") String name, Pageable pageable);
}